import os
import argparse
from dotenv import dotenv_values
from app.db import create_tables, get_session
from app.db.actions import create_user

# 创建并存储密钥的函数
def create_secret(_args):
    """
    生成一个密钥并将其存储在当前工作目录下的.env文件中。
    
    使用 `python main.py create-secret --help` 获取更多选项。
    
    如果没有.env文件存在或尚未设置密钥，此函数将创建一个新的密钥。
    若密钥已存在，则默认不会覆盖，除非使用了--overwrite选项。
    
    参数:
        _args: 解析后的命令行参数对象。
    """
    config = dotenv_values('.env')

    # 如果不存在.env文件或未设置SECRET密钥
    if config is None or config.get('SECRET') is None:
        with open('.env', 'a') as f:
            f.write(f'SECRET={os.urandom(24).hex()}')  # 生成并写入新的密钥到.env文件

        print(f"密钥已存储在{os.path.abspath('.env')}")  # 显示密钥存储位置
    else:
        print("已有密钥存在。如需创建新密钥，请使用--overwrite选项。")
        if _args.overwrite:  # 检查是否要求覆盖现有密钥
            with open('.env', 'w') as f:
                for key, value in config.items():
                    if key == 'SECRET':
                        value = os.urandom(24).hex()  # 重置SECRET值
                    f.write(f"{key}={value}")  # 写入.env文件（可能覆盖原有值）

# 创建管理员用户的函数
def create_admin(_args):
    """
    根据提供的用户名和密码创建一个管理员用户。
    
    参数:
        _args: 包含用户名和密码的命令行参数对象。
    """
    session = next(get_session())
    create_tables()
    create_user(args.username, args.password, session, is_admin=True)
    print("管理员账户已创建。")

# 启动API服务的函数
def run(_args):
    """
    启动API服务。
    """
    import uvicorn
    from app.app import app
    uvicorn.run(app)
def run_debug(_args):
    """
    调试启动API服务。
    """
    import uvicorn
    uvicorn.run('app.app:app',reload=True)

# 解析命令行参数
parser = argparse.ArgumentParser(description='用于配置API的命令行工具。')
subparsers = parser.add_subparsers()

# 创建密钥的子命令解析器
secret_parser = subparsers.add_parser('create-secret', help="在当前工作目录的.env文件中写入合适的密钥。")
secret_parser.add_argument('--overwrite', action='store_true', help="覆盖现有密钥值。")
secret_parser.set_defaults(func=create_secret)

# 创建数据库表的子命令解析器（实际功能未在注释中定义）
db_parser = subparsers.add_parser('create-db', help="为项目创建数据库和表。")
db_parser.set_defaults(func=create_tables)

# 创建管理员用户的子命令解析器
admin_parser = subparsers.add_parser('create-admin', help="根据指定的用户名和密码创建管理员用户。")
admin_parser.add_argument('username', help="管理员的用户名。")
admin_parser.add_argument('password', help="管理员的密码。")
admin_parser.set_defaults(func=create_admin)

# 启动API的子命令解析器
start_parser = subparsers.add_parser('start', help="启动API服务。")
start_parser.set_defaults(func=run)


# 启动API的子命令解析器
start_parser = subparsers.add_parser('debug', help="调试启动API服务。")
start_parser.set_defaults(func=run_debug)

# 主程序入口
if __name__ == '__main__':
    args = parser.parse_args()
    args.func(args)  # 调用与给定参数对应的函数